<!-- 售后申请 -->
<template>
  <s-layout title="申请售后">
    <!-- 售后商品 -->
    <view class="goods-box">
      <s-goods-item
        :img="state.item.picUrl"
        :title="state.item.spuName"
        :sku-text="state.item.properties?.map((property) => property.valueName).join(' ')"
        :price="state.item.price"
        :num="state.item.count"
      />
    </view>

    <uni-forms ref="form" v-model="formData" :rules="rules" label-position="top">
      <!-- 售后类型 -->
      <view class="refund-item">
        <view class="item-title ss-m-b-20">售后类型</view>
        <view class="ss-flex-col">
          <radio-group @change="onRefundChange">
            <label v-for="(item, index) in state.wayList" :key="index" class="ss-flex ss-col-center ss-p-y-10">
              <radio
                :checked="formData.type === item.value"
                color="var(--ui-BG-Main)"
                style="transform: scale(0.8)"
                :value="item.value"
              />
              <view class="item-value ss-m-l-8">{{ item.text }}</view>
            </label>
          </radio-group>
        </view>
      </view>
      <!-- 退款金额 -->
      <view class="refund-item ss-flex ss-col-center ss-row-between" @tap="state.showModal = true">
        <text class="item-title">退款金额</text>
        <view class="ss-flex refund-cause ss-col-center">
          <text class="ss-m-r-20">￥{{ fen2yuan(state.item.payPrice) }}</text>
        </view>
      </view>
      <!-- 申请原因 -->
      <view class="refund-item ss-flex ss-col-center ss-row-between" @tap="state.showModal = true">
        <text class="item-title">申请原因</text>
        <view class="ss-flex refund-cause ss-col-center">
          <text v-if="formData.applyReason" class="ss-m-r-20">{{ formData.applyReason }}</text>
          <text v-else class="ss-m-r-20">请选择申请原因~</text>
          <text class="cicon-forward" style="height: 28rpx"></text>
        </view>
      </view>

      <!-- 留言 -->
      <view class="refund-item">
        <view class="item-title ss-m-b-20">相关描述</view>
        <view class="describe-box">
          <uni-easyinput
            v-model="formData.applyDescription"
            :input-border="false"
            class="describe-content"
            type="textarea"
            maxlength="120"
            auto-height
            placeholder="客官~请描述您遇到的问题，建议上传照片"
          />
          <!-- TODO 芋艿：上传的测试 -->
          <view class="upload-img">
            <s-uploader
              v-model:url="formData.images"
              file-mediatype="image"
              limit="9"
              mode="grid"
              :image-styles="{ width: '168rpx', height: '168rpx' }"
            />
          </view>
        </view>
      </view>
    </uni-forms>

    <!-- 底部按钮 -->
    <su-fixed bottom placeholder>
      <view class="foot-wrap">
        <view class="foot_box ss-flex ss-col-center ss-row-between ss-p-x-30">
          <button class="ss-reset-button contcat-btn" @tap="sheep.$router.go('/pages/chat/index')">联系客服</button>
          <button class="ss-reset-button ui-BG-Main-Gradient sub-btn" @tap="submit">提交</button>
        </view>
      </view>
    </su-fixed>

    <!-- 申请原因弹窗 -->
    <su-popup :show="state.showModal" round="10" :show-close="true" @close="state.showModal = false">
      <view class="modal-box page_box">
        <view class="modal-head item-title head_box ss-flex ss-row-center ss-col-center"> 申请原因 </view>
        <view class="modal-content content_box">
          <radio-group @change="onChange">
            <label v-for="item in state.reasonList" :key="item" class="radio ss-flex ss-col-center">
              <view class="ss-flex-1 ss-p-20">{{ item }}</view>
              <radio :value="item" color="var(--ui-BG-Main)" :checked="item === state.currentValue" />
            </label>
          </radio-group>
        </view>
        <view class="modal-foot foot_box ss-flex ss-row-center ss-col-center">
          <button class="ss-reset-button close-btn ui-BG-Main-Gradient" @tap="onReason">确定</button>
        </view>
      </view>
    </su-popup>
  </s-layout>
</template>

<script setup>
import sheep from '@/sheep'
import { onLoad } from '@dcloudio/uni-app'
import { reactive, ref } from 'vue'
import OrderApi from '@/api/trade/order'
import TradeConfigApi from '@/api/trade/config'
import { fen2yuan } from '@/hooks/useGoods'
import AfterSaleApi from '@/api/trade/afterSale'

const form = ref(null)
const state = reactive({
  orderId: 0, // 订单编号
  itemId: 0, // 订单项编号
  order: {}, // 订单
  item: {}, // 订单项
  config: {}, // 交易配置

  // 售后类型
  wayList: [
    {
      text: '仅退款',
      value: '10',
    },
    {
      text: '退款退货',
      value: '20',
    },
  ],
  reasonList: [], // 可选的申请原因数组
  showModal: false, // 是否显示申请原因弹窗
  currentValue: '', // 当前选择的售后原因
})
const formData = reactive({
  way: '',
  applyReason: '',
  applyDescription: '',
  images: [],
})
const rules = reactive({})

// 提交表单
async function submit() {
  // #ifdef MP
  sheep.$platform.useProvider('wechat').subscribeMessage('order_aftersale_change')
  // #endif
  let data = {
    orderItemId: state.itemId,
    refundPrice: state.item.payPrice,
    ...formData,
  }
  const { code } = await AfterSaleApi.createAfterSale(data)
  if (code === 0) {
    uni.showToast({
      title: '申请成功',
    })
    sheep.$router.go('/pages/order/aftersale/list')
  }
}

// 选择售后类型
function onRefundChange(e) {
  formData.way = e.detail.value
  // 清理理由
  state.reasonList =
    formData.way === '10' ? state.config.afterSaleRefundReasons || [] : state.config.afterSaleReturnReasons || []
  formData.applyReason = ''
  state.currentValue = ''
}

// 选择申请原因
function onChange(e) {
  state.currentValue = e.detail.value
}

// 确定
function onReason() {
  formData.applyReason = state.currentValue
  state.showModal = false
}

onLoad(async (options) => {
  // 解析参数
  if (!options.orderId || !options.itemId) {
    sheep.$helper.toast(`缺少订单信息，请检查`)
    return
  }
  state.orderId = options.orderId
  state.itemId = parseInt(options.itemId)

  // 读取订单信息
  const { code, data } = await OrderApi.getOrder(state.orderId)
  if (code !== 0) {
    return
  }
  state.order = data
  state.item = data.items.find((item) => item.id === state.itemId) || {}

  // 设置选项
  if (state.order.status === 10) {
    state.wayList.splice(1, 1)
  }

  // 读取配置
  state.config = (await TradeConfigApi.getTradeConfig()).data
})
</script>

<style lang="scss" scoped>
.item-title {
  font-size: 30rpx;
  font-weight: bold;
  color: rgba(51, 51, 51, 1);
  // margin-bottom: 20rpx;
}

// 售后项目
.refund-item {
  background-color: #fff;
  border-bottom: 1rpx solid #f5f5f5;
  padding: 30rpx;

  &:last-child {
    border: none;
  }

  // 留言
  .describe-box {
    width: 690rpx;
    background: rgba(249, 250, 251, 1);
    padding: 30rpx;
    box-sizing: border-box;
    border-radius: 20rpx;

    .describe-content {
      height: 200rpx;
      font-size: 24rpx;
      font-weight: 400;
      color: #333;
    }
  }

  // 联系方式
  .input-box {
    height: 84rpx;
    background: rgba(249, 250, 251, 1);
    border-radius: 20rpx;
  }
}

.goods-box {
  background: #fff;
  padding: 20rpx;
  margin-bottom: 20rpx;
}

.foot-wrap {
  height: 100rpx;
  width: 100%;
}

.foot_box {
  height: 100rpx;
  background-color: #fff;

  .sub-btn {
    width: 336rpx;
    line-height: 74rpx;
    border-radius: 38rpx;
    color: rgba(#fff, 0.9);
    font-size: 28rpx;
  }

  .contcat-btn {
    width: 336rpx;
    line-height: 74rpx;
    background: rgba(238, 238, 238, 1);
    border-radius: 38rpx;
    font-size: 28rpx;
    font-weight: 400;
    color: rgba(51, 51, 51, 1);
  }
}

.modal-box {
  width: 750rpx;
  // height: 680rpx;
  border-radius: 30rpx 30rpx 0 0;
  background: #fff;

  .modal-head {
    height: 100rpx;
    font-size: 30rpx;
  }

  .modal-content {
    font-size: 28rpx;
  }

  .modal-foot {
    .close-btn {
      width: 710rpx;
      line-height: 80rpx;
      border-radius: 40rpx;
      color: rgba(#fff, 0.9);
    }
  }
}

.success-box {
  width: 600rpx;
  padding: 90rpx 0 64rpx 0;

  .cicon-check-round {
    font-size: 96rpx;
    color: #04b750;
  }

  .success-title {
    font-weight: 500;
    color: #333333;
    font-size: 32rpx;
  }

  .success-btn {
    width: 492rpx;
    height: 70rpx;
    background: linear-gradient(90deg, var(--ui-BG-Main-gradient), var(--ui-BG-Main));
    border-radius: 35rpx;
  }
}
</style>
